package com.ww.basic.recursion

import scala.annotation.tailrec

object Test01 {
  /**
   * 正常递归
   * @param n
   * @return
   */
  def factorial(n: Int): Int = {
    if (n == 0) return 1
    factorial(n - 1) * n
  }

  /**
   * 尾递归
   * 一、先明确核心结论
   *
   * ①尾递归 ≠ 普通递归：尾递归是「最后一步只调用自身」的特殊递归，能被编译器优化；
   * ②优化后效果：Scala 编译器会把尾递归直接转换成 无额外开销的循环结构（for/while）；
   * ③性能对比：尾递归 ≈ 原生循环（性能几乎无差异），远优于普通递归（有栈开销 + 栈溢出风险）
   *
   * @param n
   * @param result
   * @return
   */
  @tailrec
  def fac2(n: Int, result: Int): Int = {
    if (n == 0) return result
    fac2(n - 1, result * n)
  }

  def main(args: Array[String]): Unit = {
    println(fac2(5, result=1))
  }
}
